package com.warm.pump.frame.util;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class FileUtils {


	/**
	 * 获取指定目录下的所有文件（含子目录下的文件）
	 *
	 * @param dir
	 * @return
	 */
	public static List getAllFiles(File dir) {
		List list = new ArrayList();

		if (dir.isFile()) {
			list.add(dir.getPath());
		} else {
			File[] file = dir.listFiles();

			for (int i = 0, n = file.length; i < n; i++) {
				List subList = getAllFiles(file[i]);
				list.addAll(subList);
			}
		}
		return list;
	}
	/**
	 * 递归查找文件
	 * 
	 * @param baseDirName
	 *            查找的文件夹路径
	 * @param targetFileName
	 *            需要查找的文件名
	 * @param fileList
	 *            查找到的文件集合
	 */
	public static void findFiles(String baseDirName, String targetFileName,
			List fileList, boolean isRecursion) {
		/**
		 * 算法简述： 从某个给定的需查找的文件夹出发，搜索该文件夹的所有子文件夹及文件，
		 * 若为文件，则进行匹配，匹配成功则加入结果集，若为子文件夹，则进队列。 队列不空，重复上述操作，队列为空，程序结束，返回结果。
		 */
		String tempName = null;
		// 判断目录是否存在
		File baseDir = new File(baseDirName);
		if (!baseDir.exists() || !baseDir.isDirectory()) {
			System.out.println("文件查找失败：" + baseDirName + "不是一个目录！");
		} else {
			String[] filelist = baseDir.list();
			for (int i = 0; i < filelist.length; i++) {
				File readfile = new File(baseDirName + File.separator
						+ filelist[i]);
				// System.out.println(readfile.getName());
				if (!readfile.isDirectory()) {
					tempName = readfile.getName();
					if (wildcardMatch(targetFileName, tempName)) {
						// 匹配成功，将文件名添加到结果集
						fileList.add(readfile.getAbsoluteFile());
					}
				} else if (readfile.isDirectory()) {
					if (isRecursion) {
						findFiles(baseDirName + File.separator + filelist[i],
								targetFileName, fileList, isRecursion);
					}
				}
			}
		}
	}

	/**
	 * 通配符匹配
	 * 
	 * @param pattern
	 *            通配符模式
	 * @param str
	 *            待匹配的字符串
	 * @return 匹配成功则返回true，否则返回false
	 */
	private static boolean wildcardMatch(String pattern, String str) {
		int patternLength = pattern.length();
		int strLength = str.length();
		int strIndex = 0;
		char ch;
		for (int patternIndex = 0; patternIndex < patternLength; patternIndex++) {
			ch = pattern.charAt(patternIndex);
			if (ch == '*') {
				// 通配符星号*表示可以匹配任意多个字符
				while (strIndex < strLength) {
					if (wildcardMatch(pattern.substring(patternIndex + 1),
							str.substring(strIndex))) {
						return true;
					}
					strIndex++;
				}
			} else if (ch == '?') {
				// 通配符问号?表示匹配任意一个字符
				strIndex++;
				if (strIndex > strLength) {
					// 表示str中已经没有字符匹配?了。
					return false;
				}
			} else {
				if ((strIndex >= strLength) || (ch != str.charAt(strIndex))) {
					return false;
				}
				strIndex++;
			}
		}
		return (strIndex == strLength);
	}
	public static String changePath(String path){
		// 对 Windows 下获取 物理路径 做 特殊处理
		if(File.separator.equals(File.separator)) {
			path = path.substring(1).replaceAll("/", "\\\\");
		}
		return path;
	}
	public static String getClassPath(){
		String classDir = FileUtils.class.getResource("/").getPath();
		return changePath(classDir);
	}
	public static String getProjectPath(){
		String classpath = getClassPath();
		return getClassPath().substring(0, classpath.length()-14);
	}
}
